package com.jiang.serviceproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;

import com.jiang.utils.DBUtils;

/**
 * @author Administrator
 * @业务层的动态代理(处理异常、关闭连接、处理事务、处理业务) 接收方一定要用接口不能使用实现类
 */
public class ServiceProxy implements InvocationHandler {

	private Object obj; // 这个是真实对象
	// 给真实对象绑定

	public Object bind(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}

	// 调用接口的方法时候先进这个方法回调代理
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

		Object invoke = null;

		try {

			String methodName = method.getName();
			Connection conn = DBUtils.getConnection();
			// 只有修改需要事务，其他的不需要事务
			if (methodName.startsWith("save") || methodName.startsWith("update") || methodName.startsWith("delete")) {
				try {
					conn.setAutoCommit(false);
					invoke = method.invoke(obj, args);
					conn.commit();
				} catch (Exception e) {
					e.printStackTrace();
					// 回滚操作
					conn.rollback();
				}

			} else {
				invoke = method.invoke(obj, args);
			}

		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			DBUtils.close(); // 关闭连接
		}

		return invoke;
	}

}
